package movie.service;

import java.util.*;

import movie.dao.MovieDaoImpl;
import movie.modle.Movie;
import movie.util.ScannerUtil;

/**
 * 业务逻辑
 * @author 王荣
 *
 */
public class MovieService {
	//创建MovieService对象
	MovieDaoImpl ms = new MovieDaoImpl();
	//创建一个集合用来装所有电影,用来排序
	ArrayList<Movie> movies = new ArrayList<>(ms.getMovies());
	
	/**
	 * 上传影片的方法
	 */
	public void addMovie(){
		System.out.println("请输入影片信息");
		System.out.print("影片名:");
		String name = ScannerUtil.readKeyBoard(20, false);
		System.out.print("导演名(多人请用/隔开):");
		String director = ScannerUtil.readKeyBoard(20, false);
		System.out.print("主演名(多人请用/隔开):");
		String performer = ScannerUtil.readKeyBoard(100, false);
		System.out.print("影片类型(多人请用/隔开):");
		String type = ScannerUtil.readKeyBoard(20, false);
		System.out.print("上映时间(格式：年-月-日):");
		Date date = ScannerUtil.readDate("yyyy-MM-dd", false);
		Movie movie = new Movie(name, director, performer, type, date);
		
		//调用上传影片方法
		boolean addMovie = ms.addMovie(movie);
		if(addMovie){
			System.out.println("上传成功");
		}else{
			System.out.println("上传失败");
		}
	}
	
	
	/**
	 * 删除影片的方法
	 */
	public void delMovie(){
		//调用显示所有影片方法
		showMovies();
		
		System.out.print("请输入想删除的影片ID:");
		//调用键盘录入数字方法
		int id = ScannerUtil.readInt();
		//调用查找影片方法
		Movie movie = ms.searchMovie(id);
		if(movie == null) {
			System.out.println("该影片不存在");
			return;
		}
		
		System.out.println("确认要删除吗？(请输入Y或N)");
		if(ScannerUtil.readYN() == 'Y')	{
			//调用删除影片方法
			boolean delMovie = ms.delMovie(movie);
			if(delMovie){
				System.out.println("删除成功");
				//删除成功后将当前索引位置之后的所有对象，id值-1
				for(int i = id - 1;i < ms.getMovies().size();i++){
					int id2 = ms.getMovies().get(i).getId();
					ms.getMovies().get(i).setId(--id2);
				}
			}else{
				System.out.println("删除失败");
			}
		}
	}
	
	
	/**
	 * 修改影片的方法
	 * 输入为空表示不想修改该项信息
	 */
	public void modifyMovie(){
		//调用显示所有影片方法
		showMovies();
		
		System.out.print("请输入想修改的影片ID:");
		//调用键盘录入数字方法
		int id = ScannerUtil.readInt();
		
		//调用查找影片方法
		Movie movie = ms.searchMovie(id);
		if(movie == null) {
			System.out.println("该影片不存在");
			return;
		}
		
		System.out.println("请输入影片信息");
		System.out.print("影片名("+movie.getName()+"):");
		String name = ScannerUtil.readString(20, movie.getName());
		System.out.print("导演名("+movie.getDirector()+"):");
		String director = ScannerUtil.readString(20, movie.getDirector());
		System.out.print("主演名("+movie.getPerformer()+"):");
		String performer = ScannerUtil.readString(100, movie.getPerformer());
		System.out.print("影片类型("+movie.getType()+"):");
		String type = ScannerUtil.readString(20, movie.getType());
		System.out.print("上映时间("+movie.showDate()+"):");
		Date date = ScannerUtil.readDate("yyyy-MM-dd", movie.getDate());
		
		//将影片信息封装到新的对象
		Movie newMovie = new Movie(movie.getId(), name, director, performer, type, date, 
				movie.getClickRate(), movie.getRecommendRate());
		
		System.out.println("确认要修改吗？(请输入Y或N)");
		if(ScannerUtil.readYN() == 'Y')	{
			//调用修改影片信息的方法
			boolean modifyMovie = ms.modifyMovie(id, newMovie);
			if(modifyMovie){
				System.out.println("修改成功");
			}else{
				System.out.println("修改失败");
			}
		}
	}

	
	/**
	 * 显示所有影片信息的方法
	 */
	public void showMovies(){
		System.out.println("ID\t影片名称\t导演\t主演\t影片类型\t上映时间\t\t点击率\t推荐率");
		for (Movie movie : ms.getMovies()) {
			System.out.println(movie);
		}
	}

	
	/**
	 * 根据关键字搜索影片的方法
	 */
	public void search(){
		System.out.println("请输入关键字(多个关键字请用/隔开)");
		//调用键盘录入方法获取关键字
		String str = ScannerUtil.readKeyBoard(20, false);
		String[] keywords = str.split("/");
		
		ArrayList<Integer> list = new ArrayList<Integer>();//用来装影片ID
		
		System.out.println("ID\t影片名称\t导演\t主演\t影片类型\t上映时间\t\t点击率\t推荐率");
		//遍历含有所有关键字的对象
		Other: for (Movie movie : ms.getMovies()) {
			for (String keyword : keywords) {
				//有一个关键字不符合就结束当次外循环
				if(! movie.showAll().contains(keyword))	continue Other;
			}
			System.out.println(movie);
			//把影片ID存到集合中
			list.add(movie.getId());
		}	
		System.out.println("请输入想观看的电影ID,返回上一级请输入0");
		int id = ScannerUtil.readInt();
		if(id == 0){
			return;
		}else if(list.contains(id)){
			//调用观看影片的方法
			watch(id);
		}else{
			System.out.println("未找到该电影");
		}
	}
	
	
	/**
	 * 观看影片的方法
	 * @param id 影片ID
	 */
	public void watch(int id){
		System.out.println("观看成功");//应该跳转到该电影，暂时无法实现
		//观看成功后该影片点击率+1
		int clickRate = ms.getMovies().get(id-1).getClickRate();
		ms.getMovies().get(id-1).setClickRate(clickRate+1);
		
		System.out.println("是否推荐该电影？(请输入Y或N)");
		char readYN = ScannerUtil.readYN();
		if(readYN == 'Y'){
			//如果选择是，推荐率+1
			int recommendRate = ms.getMovies().get(id-1).getRecommendRate();
			ms.getMovies().get(id-1).setRecommendRate(recommendRate+1);
			System.out.println("感谢您的推荐");
		}
	}
	
	
	/**
	 * 按点击率排序，从高到低
	 */
	public void clickRateSort(){
		
		movies.sort(new Comparator<Movie>() {

			@Override
			public int compare(Movie o1, Movie o2) {
				return o2.getClickRate()-o1.getClickRate();
			}
		});
		
		
	}
	
	
	/**
	 * 按推荐率排序，从高到低
	 */
	public void scoreSort(){
		movies.sort(new Comparator<Movie>() {

			@Override
			public int compare(Movie o1, Movie o2) {
				return o2.getRecommendRate()-o1.getRecommendRate();
			}
		});
		
	}
	
	
	/**
	 * 按上映时间排序，从最新上映开始
	 */
	public void dateSort(){
		movies.sort(new Comparator<Movie>() {

			@Override
			public int compare(Movie o1, Movie o2) {
				return (int) (o1.getDate().getTime()-o2.getDate().getTime());
			}
		});
		
	}
	

	/**
	 * 显示排序后功能的方法
	 */
	public void showSort(){
		//显示排序后的所有影片
		System.out.println("ID\t影片名称\t导演\t主演\t影片类型\t上映时间\t\t点击率\t推荐率");
		for (Movie movie : movies) {
			System.out.println(movie);
		}
		
		System.out.println("请输入想观看的电影ID,返回上一级请输入0");
		int id = ScannerUtil.readInt();
		if(id == 0)		return;
		
		Movie movie = ms.searchMovie(id);
		if(movie == null){
			System.out.println("找不到该影片");
			return;
		}
		
		//调用观看影片的方法
		watch(id);
	}
	
	
	
	
	
	
	
}
